﻿@* --------------------------------------------------------------------------------------------------------------------
// <copyright file="RenderProcessorJsFile.cshtml" company="Devbridge Group LLC">
// 
// Copyright (C) 2015,2016 Devbridge Group LLC
// 
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// 
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
// 
// You should have received a copy of the GNU Lesser General Public License
// along with this program.  If not, see http://www.gnu.org/licenses/. 
// </copyright>
// 
// <summary>
// Better CMS is a publishing focused and developer friendly .NET open source CMS.
// 
// Website: https://www.bettercms.com 
// GitHub: https://github.com/devbridge/bettercms
// Email: info@bettercms.com
// </summary>
// -------------------------------------------------------------------------------------------------------------------- *@
@using BetterCms.Module.Root.Mvc.Helpers
@model BetterCms.Module.Root.ViewModels.Rendering.RenderProcessorJsViewModel

/*jslint unparam: true, white: true, browser: true, devel: true */
/*global bettercms */

bettercms.define('bcms.processor', [@Model.JavaScriptModules.RenderCommaSeparatedNames()], function (@Model.JavaScriptModules.RenderCommaSeparatedFriendlyNames()) {
    'use strict';
    
    var $ = bettercms.require('bcms.jquery'),

        processor = {},

        selectors = {
            onClickModuleAction: '.bcms-onclick-action',
            onChangeModuleAction: '.bcms-onchange-action'
        },

        externalModules  = [];
    
    processor.init = function() {
        initializeLinks();
        initializeGlobalization();    
        registerExternalModules();
        initializeModuleActionHandlers();
    };
    
    processor.executeModuleAction = function(moduleName, actionString, sender) {
        try
        {
            if (actionString.lastIndexOf('()') < 0) {
                actionString = actionString + '(sender)';
            }
            var f = new Function("module", "sender", "module." + actionString);
            f.call(this, externalModules[moduleName], sender);
        }
        catch (ex)
        {
            bcms.logger.error('Failed to execute action ' + moduleName + '.' + actionString + '. ' + ex.message);
        }
    }

    function initializeModuleActionHandlers() {
          $(document).on('click.bcms.action', selectors.onClickModuleAction, function (event) {
            event.stopPropagation();

            var target = $(this),
                moduleName = target.data('bcms-module'),
                actionName = target.data('bcms-action');

            if (target.hasClass('bcms-settings-link')) {
                target.parent().find('.bcms-settings-link-active').removeClass('bcms-settings-link-active');
                target.addClass('bcms-settings-link-active');
            }           
            
            processor.executeModuleAction(moduleName, actionName, target);
        });
        
        $(document).on('change.bcms.action', selectors.onChangeModuleAction, function (event) {
            event.stopPropagation();

            var target = $(this),
                moduleName = target.data('bcms-module'),
                actionName = target.data('bcms-action');

            processor.executeModuleAction(moduleName, actionName, target);
        });
    }        
    
    function registerExternalModules() {
        @foreach(var module in Model.JavaScriptModules)
        {
            <text>
                externalModules['@module.Name'] = @module.FriendlyName;
            </text>
        }
    }

    function initializeLinks() {
        @foreach(var module in Model.JavaScriptModules)
        {
            if (module.Links != null && module.Links.Projections != null && module.Links.Projections.Any())
            {
                <text>
                    /* Initialize @module.Name module links. */
                    try
                    {
                </text>
                foreach (var item in module.Links.Projections)
                {
                    item.Render(Html);
                }
                <text>
                    }                    
                    catch (ex)
                    {
                        bcms.logger.error("Failed to initialize @module.Name links. ", ex.message);
                    }
                </text>
            }
        }
    }
    
    function initializeGlobalization() {
        @foreach(var module in Model.JavaScriptModules)
        {
            if (module.Globalization != null && module.Globalization.Projections != null && module.Globalization.Projections.Any())
            {
                <text>
                    /* Initialize @module.Name module globalizations. */
                    try
                    {
                </text>
                foreach (var item in module.Globalization.Projections)
                {
                    item.Render(Html);
                }
                <text>
                    }                    
                    catch (ex)
                    {
                        bcms.logger.error("Failed to initialize @module.Name globalization. ", ex.message);
                    }
                </text>
            }
        }
    }

    return processor;
});